{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8.5-final"
    },
    "orig_nbformat": 2,
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "colab": {
      "name": "train.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "49486996d1884f179915a5532fc48f08": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_1d30beec0814457cb724623fee0ac03a",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_35ca9ff815fa4ac79391a8c573692b2e",
              "IPY_MODEL_ab68aaa0869d400fb356f9b8035975f5"
            ]
          }
        },
        "1d30beec0814457cb724623fee0ac03a": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "35ca9ff815fa4ac79391a8c573692b2e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_f26c8216d6cc4b8994efbf58988020f5",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "info",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_19a3c08676cb47738e81bad74abdb661"
          }
        },
        "ab68aaa0869d400fb356f9b8035975f5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_eecf2e4ee42945b39423e375707b5072",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 9920512/? [00:17&lt;00:00, 1050365.69it/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_4837f5185b6c456aa130f16673d6d336"
          }
        },
        "f26c8216d6cc4b8994efbf58988020f5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "initial",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "19a3c08676cb47738e81bad74abdb661": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "eecf2e4ee42945b39423e375707b5072": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "4837f5185b6c456aa130f16673d6d336": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "7d1df042306b457a908e8018b1d08248": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_e0e85fb768d24d40a82753cbccd53acd",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_107b0a8597394002a1123ecc3a6fb242",
              "IPY_MODEL_c87c31ac484946978807e7494bd41627"
            ]
          }
        },
        "e0e85fb768d24d40a82753cbccd53acd": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "107b0a8597394002a1123ecc3a6fb242": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_8a36f3a7d4e44371935b0f97bba3404e",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_c987d4537da14329b5028b38a07673ea"
          }
        },
        "c87c31ac484946978807e7494bd41627": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_ac7113e3d64443628faf3c2f95f0672d",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 32768/? [00:00&lt;00:00, 33066.62it/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_29d5d3cf3d5b492abb2817cc07416e02"
          }
        },
        "8a36f3a7d4e44371935b0f97bba3404e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "initial",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "c987d4537da14329b5028b38a07673ea": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "ac7113e3d64443628faf3c2f95f0672d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "29d5d3cf3d5b492abb2817cc07416e02": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "a305307ae8b84dd79706129b28c8f1d5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_669411b48a7d40b696bfc484376db1f2",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_e93071f08eb94387b6d57df4e47b7a05",
              "IPY_MODEL_ec113298fd344d0a831769f8aeab52e3"
            ]
          }
        },
        "669411b48a7d40b696bfc484376db1f2": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "e93071f08eb94387b6d57df4e47b7a05": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_fbc13c2801a742a98196637dc741a926",
            "_dom_classes": [],
            "description": "",
            "_model_name": "FloatProgressModel",
            "bar_style": "success",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 1,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_d9cb440b74824af39e5079f34e25fc6f"
          }
        },
        "ec113298fd344d0a831769f8aeab52e3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_521b5c4d72274867b78c71a993260a9e",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 1654784/? [00:00&lt;00:00, 2277792.10it/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_57b40792449b4d77840075fbc97022d3"
          }
        },
        "fbc13c2801a742a98196637dc741a926": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "initial",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "d9cb440b74824af39e5079f34e25fc6f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "521b5c4d72274867b78c71a993260a9e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "57b40792449b4d77840075fbc97022d3": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "2de78678d9264045b1c90d1df5ecae72": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "state": {
            "_view_name": "HBoxView",
            "_dom_classes": [],
            "_model_name": "HBoxModel",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "box_style": "",
            "layout": "IPY_MODEL_a30308b28422450fafb44393ad7beac1",
            "_model_module": "@jupyter-widgets/controls",
            "children": [
              "IPY_MODEL_b5a793b756de4007b9fc656f89e10672",
              "IPY_MODEL_51182e941a4e4c8bb4b8ec4f5c218999"
            ]
          }
        },
        "a30308b28422450fafb44393ad7beac1": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "b5a793b756de4007b9fc656f89e10672": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "state": {
            "_view_name": "ProgressView",
            "style": "IPY_MODEL_e304d4ffd15044dfbcbf9e12610f799d",
            "_dom_classes": [],
            "description": "  0%",
            "_model_name": "FloatProgressModel",
            "bar_style": "info",
            "max": 1,
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": 0,
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "orientation": "horizontal",
            "min": 0,
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_111a80e50cfb4f379bea649be7b3f1af"
          }
        },
        "51182e941a4e4c8bb4b8ec4f5c218999": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "state": {
            "_view_name": "HTMLView",
            "style": "IPY_MODEL_d20d823711684d1195c2d4746bce80c8",
            "_dom_classes": [],
            "description": "",
            "_model_name": "HTMLModel",
            "placeholder": "​",
            "_view_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "value": " 0/4542 [00:00&lt;?, ?it/s]",
            "_view_count": null,
            "_view_module_version": "1.5.0",
            "description_tooltip": null,
            "_model_module": "@jupyter-widgets/controls",
            "layout": "IPY_MODEL_d47d43ccfd314d959c1baedd0b722dc0"
          }
        },
        "e304d4ffd15044dfbcbf9e12610f799d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "ProgressStyleModel",
            "description_width": "initial",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "bar_color": null,
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "111a80e50cfb4f379bea649be7b3f1af": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        },
        "d20d823711684d1195c2d4746bce80c8": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_view_name": "StyleView",
            "_model_name": "DescriptionStyleModel",
            "description_width": "",
            "_view_module": "@jupyter-widgets/base",
            "_model_module_version": "1.5.0",
            "_view_count": null,
            "_view_module_version": "1.2.0",
            "_model_module": "@jupyter-widgets/controls"
          }
        },
        "d47d43ccfd314d959c1baedd0b722dc0": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "state": {
            "_view_name": "LayoutView",
            "grid_template_rows": null,
            "right": null,
            "justify_content": null,
            "_view_module": "@jupyter-widgets/base",
            "overflow": null,
            "_model_module_version": "1.2.0",
            "_view_count": null,
            "flex_flow": null,
            "width": null,
            "min_width": null,
            "border": null,
            "align_items": null,
            "bottom": null,
            "_model_module": "@jupyter-widgets/base",
            "top": null,
            "grid_column": null,
            "overflow_y": null,
            "overflow_x": null,
            "grid_auto_flow": null,
            "grid_area": null,
            "grid_template_columns": null,
            "flex": null,
            "_model_name": "LayoutModel",
            "justify_items": null,
            "grid_row": null,
            "max_height": null,
            "align_content": null,
            "visibility": null,
            "align_self": null,
            "height": null,
            "min_height": null,
            "padding": null,
            "grid_auto_rows": null,
            "grid_gap": null,
            "max_width": null,
            "order": null,
            "_view_module_version": "1.2.0",
            "grid_template_areas": null,
            "object_position": null,
            "object_fit": null,
            "grid_auto_columns": null,
            "margin": null,
            "display": null,
            "left": null
          }
        }
      }
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "nyRpwMqjx1Q3"
      },
      "source": [
        "# import libraries\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "\n",
        "import torchvision\n",
        "import torchvision.transforms as transforms\n",
        "\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from tqdm import tqdm\n",
        "\n",
        "from network import ConvAutoEncoder\n",
        "from models.pretrained.network import Network"
      ],
      "execution_count": 2,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Sxcuy3TDx1RI"
      },
      "source": [
        "# set available device\n",
        "device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')"
      ],
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "zH2y1Rt2x1RN",
        "outputId": "e35648ac-5ea8-4732-fb91-910f8bbb36fc",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 392,
          "referenced_widgets": [
            "49486996d1884f179915a5532fc48f08",
            "1d30beec0814457cb724623fee0ac03a",
            "35ca9ff815fa4ac79391a8c573692b2e",
            "ab68aaa0869d400fb356f9b8035975f5",
            "f26c8216d6cc4b8994efbf58988020f5",
            "19a3c08676cb47738e81bad74abdb661",
            "eecf2e4ee42945b39423e375707b5072",
            "4837f5185b6c456aa130f16673d6d336",
            "7d1df042306b457a908e8018b1d08248",
            "e0e85fb768d24d40a82753cbccd53acd",
            "107b0a8597394002a1123ecc3a6fb242",
            "c87c31ac484946978807e7494bd41627",
            "8a36f3a7d4e44371935b0f97bba3404e",
            "c987d4537da14329b5028b38a07673ea",
            "ac7113e3d64443628faf3c2f95f0672d",
            "29d5d3cf3d5b492abb2817cc07416e02",
            "a305307ae8b84dd79706129b28c8f1d5",
            "669411b48a7d40b696bfc484376db1f2",
            "e93071f08eb94387b6d57df4e47b7a05",
            "ec113298fd344d0a831769f8aeab52e3",
            "fbc13c2801a742a98196637dc741a926",
            "d9cb440b74824af39e5079f34e25fc6f",
            "521b5c4d72274867b78c71a993260a9e",
            "57b40792449b4d77840075fbc97022d3",
            "2de78678d9264045b1c90d1df5ecae72",
            "a30308b28422450fafb44393ad7beac1",
            "b5a793b756de4007b9fc656f89e10672",
            "51182e941a4e4c8bb4b8ec4f5c218999",
            "e304d4ffd15044dfbcbf9e12610f799d",
            "111a80e50cfb4f379bea649be7b3f1af",
            "d20d823711684d1195c2d4746bce80c8",
            "d47d43ccfd314d959c1baedd0b722dc0"
          ]
        }
      },
      "source": [
        "# extract and transform the data\n",
        "train_set = torchvision.datasets.MNIST(\n",
        "    root='./data/',\n",
        "    train=True,\n",
        "    download=True,\n",
        "    transform=transforms.ToTensor()\n",
        ")\n",
        "test_set = torchvision.datasets.MNIST(\n",
        "    root='./data/',\n",
        "    train=False,\n",
        "    download=True,\n",
        "    transform=transforms.ToTensor()\n",
        ")\n",
        "\n",
        "train_loader = torch.utils.data.DataLoader(train_set, batch_size=256, shuffle=True, num_workers=1)\n",
        "test_loader = torch.utils.data.DataLoader(test_set, batch_size=32, num_workers=1)"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to ./data/MNIST/raw/train-images-idx3-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "49486996d1884f179915a5532fc48f08",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./data/MNIST/raw/train-images-idx3-ubyte.gz to ./data/MNIST/raw\n",
            "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz to ./data/MNIST/raw/train-labels-idx1-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "7d1df042306b457a908e8018b1d08248",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./data/MNIST/raw/train-labels-idx1-ubyte.gz to ./data/MNIST/raw\n",
            "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to ./data/MNIST/raw/t10k-images-idx3-ubyte.gz\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "a305307ae8b84dd79706129b28c8f1d5",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./data/MNIST/raw/t10k-images-idx3-ubyte.gz to ./data/MNIST/raw\n",
            "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz to ./data/MNIST/raw/t10k-labels-idx1-ubyte.gz\n",
            "\n",
            "\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "2de78678d9264045b1c90d1df5ecae72",
              "version_minor": 0,
              "version_major": 2
            },
            "text/plain": [
              "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Extracting ./data/MNIST/raw/t10k-labels-idx1-ubyte.gz to ./data/MNIST/raw\n",
            "Processing...\n",
            "Done!\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/torchvision/datasets/mnist.py:480: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at  /pytorch/torch/csrc/utils/tensor_numpy.cpp:141.)\n",
            "  return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ghqKHsdfx1RR",
        "outputId": "3a3f6900-a39a-4def-e555-74e4f703f869",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# load the model we trained in the MNIST project; for the encoder part\n",
        "pretrained_model = Network()\n",
        "pretrained_model.load_state_dict(\n",
        "    torch.load('models/pretrained/model-run(lr=0.001, batch_size=256).ckpt', map_location=device)\n",
        "    )\n",
        "model = ConvAutoEncoder(pretrained_model)\n",
        "model"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "ConvAutoEncoder(\n",
              "  (encoder): Sequential(\n",
              "    (0): Conv2d(1, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
              "    (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
              "    (2): ReLU()\n",
              "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
              "    (4): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
              "    (5): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
              "    (6): ReLU()\n",
              "    (7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
              "    (8): Conv2d(32, 4, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (9): BatchNorm2d(4, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
              "    (10): ReLU()\n",
              "  )\n",
              "  (decoder): Sequential(\n",
              "    (0): Conv2d(4, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
              "    (2): ReLU()\n",
              "    (3): Upsample(scale_factor=2.0, mode=nearest)\n",
              "    (4): Conv2d(32, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
              "    (5): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
              "    (6): ReLU()\n",
              "    (7): Upsample(scale_factor=2.0, mode=nearest)\n",
              "    (8): Conv2d(16, 1, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
              "    (9): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
              "    (10): Sigmoid()\n",
              "  )\n",
              ")"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "g0n7T68B6BOM",
        "outputId": "0ddcd0ac-5883-41b0-8f39-7e5c79401814",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# to check if our weight transfer was successful or not\n",
        "list(list(pretrained_model.layer2.children())[0].parameters()) == list(list(model.encoder.children())[4].parameters())\n",
        "# or \"False in (list(pretrained_model.layer1.children())[0].weight == list(model.encoder.children())[0].weight)\" --> False"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "True"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rF9qoCYCx1RX"
      },
      "source": [
        "# freeze the transferred weights\n",
        "for layer_num, child in enumerate(model.encoder.children()):\n",
        "    if layer_num < 8:\n",
        "        for param in child.parameters():\n",
        "            param.requires_grad = False"
      ],
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IaF7xNRBx1Rb"
      },
      "source": [
        "model.to(device)\n",
        "criterion = nn.MSELoss()\n",
        "optimizer = optim.Adam([  # parameters which need optimization\n",
        "                        {'params':model.encoder[8:].parameters()},\n",
        "                        {'params':model.decoder.parameters()}\n",
        "                        ], lr=0.01)\n",
        "scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=1/3, patience=3, verbose=True)"
      ],
      "execution_count": 8,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_DBSjHLux1Rf",
        "outputId": "63e3eb6a-649d-4b9a-af25-0b5cc41f0106",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "num_epochs = 30\n",
        "for epoch in range(num_epochs):\n",
        "    train_loss = 0\n",
        "    ###################\n",
        "    # train the model #\n",
        "    ###################\n",
        "    loop = tqdm(train_loader, total=len(train_loader))\n",
        "    for batch in loop:\n",
        "        images = batch[0].to(device)\n",
        "        _, outputs = model(images)\n",
        "        loss = criterion(outputs, images)\n",
        "        optimizer.zero_grad()\n",
        "        loss.backward()\n",
        "        optimizer.step()\n",
        "\n",
        "        train_loss += loss.item()*images.size(0)\n",
        "        loop.set_description(f'Epoch [{epoch+1:2d}/{num_epochs}]')\n",
        "        loop.set_postfix(loss=train_loss)\n",
        "\n",
        "    scheduler.step(train_loss)"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch [ 1/30]: 100%|██████████| 235/235 [00:07<00:00, 31.79it/s, loss=3.22e+3]\n",
            "Epoch [ 2/30]: 100%|██████████| 235/235 [00:07<00:00, 32.14it/s, loss=723]\n",
            "Epoch [ 3/30]: 100%|██████████| 235/235 [00:07<00:00, 31.40it/s, loss=484]\n",
            "Epoch [ 4/30]: 100%|██████████| 235/235 [00:07<00:00, 32.97it/s, loss=405]\n",
            "Epoch [ 5/30]: 100%|██████████| 235/235 [00:07<00:00, 32.18it/s, loss=359]\n",
            "Epoch [ 6/30]: 100%|██████████| 235/235 [00:07<00:00, 31.97it/s, loss=333]\n",
            "Epoch [ 7/30]: 100%|██████████| 235/235 [00:07<00:00, 33.16it/s, loss=313]\n",
            "Epoch [ 8/30]: 100%|██████████| 235/235 [00:07<00:00, 31.78it/s, loss=299]\n",
            "Epoch [ 9/30]: 100%|██████████| 235/235 [00:07<00:00, 33.44it/s, loss=288]\n",
            "Epoch [10/30]: 100%|██████████| 235/235 [00:07<00:00, 32.17it/s, loss=281]\n",
            "Epoch [11/30]: 100%|██████████| 235/235 [00:07<00:00, 33.45it/s, loss=275]\n",
            "Epoch [12/30]: 100%|██████████| 235/235 [00:06<00:00, 33.94it/s, loss=270]\n",
            "Epoch [13/30]: 100%|██████████| 235/235 [00:07<00:00, 31.72it/s, loss=266]\n",
            "Epoch [14/30]: 100%|██████████| 235/235 [00:07<00:00, 32.44it/s, loss=263]\n",
            "Epoch [15/30]: 100%|██████████| 235/235 [00:07<00:00, 31.11it/s, loss=259]\n",
            "Epoch [16/30]: 100%|██████████| 235/235 [00:07<00:00, 33.25it/s, loss=256]\n",
            "Epoch [17/30]: 100%|██████████| 235/235 [00:07<00:00, 32.51it/s, loss=253]\n",
            "Epoch [18/30]: 100%|██████████| 235/235 [00:07<00:00, 33.07it/s, loss=252]\n",
            "Epoch [19/30]: 100%|██████████| 235/235 [00:07<00:00, 33.02it/s, loss=251]\n",
            "Epoch [20/30]: 100%|██████████| 235/235 [00:06<00:00, 33.72it/s, loss=249]\n",
            "Epoch [21/30]: 100%|██████████| 235/235 [00:06<00:00, 34.29it/s, loss=247]\n",
            "Epoch [22/30]: 100%|██████████| 235/235 [00:07<00:00, 31.79it/s, loss=245]\n",
            "Epoch [23/30]: 100%|██████████| 235/235 [00:06<00:00, 34.64it/s, loss=245]\n",
            "Epoch [24/30]: 100%|██████████| 235/235 [00:07<00:00, 31.51it/s, loss=243]\n",
            "Epoch [25/30]: 100%|██████████| 235/235 [00:07<00:00, 33.36it/s, loss=242]\n",
            "Epoch [26/30]: 100%|██████████| 235/235 [00:07<00:00, 32.25it/s, loss=241]\n",
            "Epoch [27/30]: 100%|██████████| 235/235 [00:07<00:00, 32.65it/s, loss=240]\n",
            "Epoch [28/30]: 100%|██████████| 235/235 [00:07<00:00, 32.68it/s, loss=240]\n",
            "Epoch [29/30]: 100%|██████████| 235/235 [00:07<00:00, 32.78it/s, loss=240]\n",
            "Epoch [30/30]: 100%|██████████| 235/235 [00:07<00:00, 33.04it/s, loss=238]\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "83ilBoAWx1Ri"
      },
      "source": [
        "# save the model\n",
        "torch.save(model.state_dict(), 'models/model-autoencoder.pth')"
      ],
      "execution_count": 10,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6UMgy-ak1DJt",
        "outputId": "bac9483f-ee2e-4962-87dc-91f68d56cb48",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 233
        }
      },
      "source": [
        "# obtain one batch of test images\n",
        "images, labels = next(iter(test_loader))\n",
        "images = images.to(device)\n",
        "\n",
        "# get sample outputs\n",
        "encoded_imgs, decoded_imgs = model(images)\n",
        "# prep images for display\n",
        "images = images.cpu().numpy()\n",
        "\n",
        "# use detach when it's an output that requires_grad\n",
        "encoded_imgs = encoded_imgs.detach().cpu().numpy()\n",
        "decoded_imgs = decoded_imgs.detach().cpu().numpy()\n",
        "\n",
        "# plot the first ten input images and then reconstructed images\n",
        "fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(25,4))\n",
        "\n",
        "# input images on top row, reconstructions on bottom\n",
        "for images, row in zip([images, decoded_imgs], axes):\n",
        "    for img, ax in zip(images, row):\n",
        "        ax.imshow(np.squeeze(img), cmap='gray')\n",
        "        ax.get_xaxis().set_visible(False)\n",
        "        ax.get_yaxis().set_visible(False)\n",
        "\n",
        "plt.show()\n",
        "fig.savefig('images/original_decoded.png', bbox_inches='tight')\n",
        "plt.close()"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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uY8pU6aMZ27r1q0qF7QOZS4Ko/ZiKo5Tbo3Ujh072vj5559XuS1bttj4kksuUbnly5eH37kckIqaraVKlbLxww8/rHKNGze2sVuPf8WKFQn3K2j9P/k+twbz9ddfb+Nx48ap3KpVqxJeB5CITLmvEZUofivEb5nutY5sy32WMcY0bNhQta+99lobd+jQQeXkOZX8jQG3P+76Jfdc+9JLL7Wxe+yT129AlHgSFwAAAAAAAABijJu4AAAAAAAAABBjSZdTyDa5Pl0i3cKaktG5c2cb9+rVy/O1GzduVLkuXbrYeN68eSq3b98+G8tyCcYY07ZtW9UuV66cjU899VSVk9MT9+/f79m3ZOTauE10al6cPxd3muof//hHG+/atUvl/vd//9fGR5smLQWdwohwyM+/WLFiKnfHHXfY+M4771S5kiVL2tjdbu6U9QoVKtjYnWImy8OkukQI4y04OY3vsssuUzl5jPrmm29ULpnPPNHXnnbaaardo0cPG997770qt2nTpoTXX9B+ZYJMPE655yBy/2KMMSNGjLBxxYoVVU7+He7xDYmLYj8qlymPL8YYM2bMGBvLc2dj9Hnwhg0bVC7RkjDJ5NwpzJUrV7bx5MmTVU6WV3jttdc8l4lo+E09r1u3ro27deumcrLsz9y5c1VOnrME7YsxiX9voigRkK2S+b4HPfbJ98mSY8YY07VrVxvLMmLGGFOjRg3VLlGihI3dY5FfmQQ/sq9+411e/xtDOYW4SuZ+i994DrqfiKK8I0/iAgAAAAAAAECMcRMXAAAAAAAAAGKMm7gAAAAAAAAAEGOhFbFKpj6NrF3i1gbs0KGDjUuXLq1ysjbkqlWrVG7ChAk2njlzpsrJOqhu/R2/fhcuXFjl3LYka7m469izZ88Rl3801O7x5tbO6dixo423bdumctOnT7fxzTffrHLbt2+3sV+tHjlmjfnvunHyvYsWLVI5t6ZlELm+vbNB7dq1VVvWVV69erXK/fTTTzZm28eXu48+9thjbXzdddep3N13321jd38it7FbA9mtxdWkSRMbv/HGGyp300032fjXX39VuTD2Q0hcMt9beTy59dZbVU5u/++//17lwtqm8txG1sA1xphOnTrZeNy4cSq3efNmGwetg5etgtZsjILf5+2e115zzTWqXadOHc/lyPPwHTt2FKSLSYvT51tQUfRdHose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\n",
            "text/plain": [
              "<Figure size 1800x288 with 20 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7k6sF-gRMzL2",
        "outputId": "be1bda7e-3a2f-4bda-f450-b513f8ef0691",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 267
        }
      },
      "source": [
        "# plot the encoded image's feature maps\n",
        "encoded_img = encoded_imgs[6]  # get the 7th image from the batch (7th image in the plot above)\n",
        "\n",
        "fig = plt.figure(figsize=(4,4))\n",
        "for fm in range(encoded_img.shape[0]):\n",
        "    ax = fig.add_subplot(2, 2, fm+1, xticks=[], yticks=[])\n",
        "    ax.set_title(f'feature map: {fm}')\n",
        "    ax.imshow(encoded_img[fm], cmap='gray')\n",
        "\n",
        "plt.show()\n",
        "fig.savefig('images/encoded_img_4')\n",
        "plt.close()"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 288x288 with 4 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xhQE_c2G6BOl",
        "outputId": "afaf2887-23b6-4119-cdcb-01333ca26edd",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 267
        }
      },
      "source": [
        "# again, cause why not?\n",
        "encoded_img = encoded_imgs[0]  # get 1st image from the batch (here '7')\n",
        "\n",
        "fig = plt.figure(figsize=(4,4))\n",
        "for fm in range(encoded_img.shape[0]):\n",
        "    ax = fig.add_subplot(2, 2, fm+1, xticks=[], yticks=[])\n",
        "    ax.set_title(f'feature map: {fm}')\n",
        "    ax.imshow(encoded_img[fm], cmap='gray')\n",
        "\n",
        "plt.show()\n",
        "fig.savefig('images/encoded_img_7')\n",
        "plt.close()"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 288x288 with 4 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    }
  ]
}